; 保护模式相关的宏定义

;=====================================================================
; 数据段/代码段描述符宏定义
; 使用方法 Descriptor Base, Limit, Attr
; 入参：
;       Base - dd，表示段的基地址
;       Limit - dd，表示段界限，低20位
;       Attr - dw，表示段属性，一般是使用低4位
%macro Descriptor 3
    dw %2 & 0FFFFh ; 段界限1
    dw %1 & 0FFFFh ; 段基址1（低16位）
    db (%1 >> 16) & 0FFh ; 段基址2（高16位中的低8位）
    dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性1 + 段界限2 + 属性2
    db (%1 >> 24) & 0FFh ; 段基址3 （高16位中的高8位）
%endmacro ; 一共8个字节

;=====================================================================
; 门描述符定义
; 使用方法 GateDesc Offset Selector Attr ParaCount
; 入参：
;   Offset - dd，表示段偏移
;   Selector - dw，表示段选择符
;   Attr - db, 表示段属性
;   ParaCount - db,表示参数个数
%macro GateDesc 4
    dw %1 & 0FFFFh          ; 段偏移的低16位
    dw %2                   ; 段选择符
    db %4 & 01Fh            ; 参数个数，低5位
    db %3                   ; 段属性
    dw (%1 >> 16) & 0FFFFh  ; 段偏移的高16位
%endmacro ; 一共8个字节

;===========================================================
; 页目录表项和页表项宏定义
; 使用方法 PageEntry Base Attr
; 入参说明:
;   Base -- dd，只用到20位，页表目录或页表项的基地址
;   Attr -- dw，只用到12位，页表目录项或页表项的属性
%macro PageEntry 2
    dd ((%1 << 12) & 0FFFFF000h) | (%2 & 0FFFh)
%endmacro   ; 一共4字节

; ==========================================================
; 描述符属性 Byte6 - Byte5
; G D/B 0 AVL 0 0 0 0     P DPL(2位) DT TYPE(4位)
; ==========================================================

; 32位段 Byte6
DA_32   equ 4000h   ; 0100 0000 0000 0000,32位段
DA_G_4K equ 8000h   ; 1000 0000 0000 0000, 段界限颗粒度=4K

; 权限 Byte5
DA_DPL0 equ 00h ; DPL=0, 00000000
DA_DPL1 equ 20h ; DPL=1, 00100000
DA_DPL2 equ 40h ; DPL=2, 01000000
DA_DPL3 equ 60h ; DPL=3, 01100000

; 数据段/代码段描述符属性 Byte5
DA_DR equ  90h  ; 只读数据段 10010000
DA_DRW equ 92h  ; 可读可写数据段 10010010 
DA_DRWA equ 93h ; 已访问可读可写数据段 10010011
DA_C equ 98h    ; 只执行代码段 10011000
DA_CR equ 9ah   ; 可执行可读代码段 10011010
DA_CC0 equ 9ch  ; 只执行一致代码段 10011100
DA_CC0R equ 9eh ; 可执行可读一致代码段 10011110

; 系统段描述符属性 Byte5
DA_LDT equ 82h      ; LDT描述符，10000010
DA_TaskGate equ 85h ; 任务门描述符，10000101
DA_386TSS equ 89h   ; 32位TSS段，10001001
DA_386CGate equ 8ch ; 32位调用门，10001100
DA_386IGate equ 8eh ; 32位中断门，10001110
DA_386TGate equ 8fh ; 32位陷阱门，10001111

; 段选择符的权限RPL，最低两位
SA_DPL0 equ 00h
SA_DPL1 equ 01h
SA_DPL2 equ 02h
SA_DPL3 equ 03h

;==================================================
; 页目录项和页表项属性定义
PA_P        equ 0001h       ; 页面存在
PA_RW       equ 0002h       ; 页面可读可写
PA_USER     equ 0004h       ; 页面为普通用户权限
PA_PS_4K    equ 0000h       ; 每个页大小为4k

; ==================================================
; boot阶段相关的宏定义
